import axios from "axios";

// 缓存纯函数的返回值
const cachePureResult = (fn: (par: string) => string) => {
  const storage: { [k in string]: string } = {};

  return (par: string): string => {
    return storage[par] ? storage[par] : (storage[par] = fn(par));
  }
}

// 返回字符串首字母大写(带缓存)
const capitalize = cachePureResult(
  (str: string): string => {
    return str.charAt(0).toUpperCase() + str.slice(1);
  }
);

// 将下横线或中横线命名的转换为大驼峰命名(带缓存)
const camelize = cachePureResult(
  (str: string, symbol = "[_|-]"): string => {
    const reg = new RegExp(`${symbol}(\\w)`, "g");
    return str.replace(reg, (_, c) => c ? c.toUpperCase() : '')
  }
);

// 获取组件名, 大驼峰形式(带缓存)
const handleCompName = cachePureResult(
  (str: string): string => {
    str = capitalize(str);
    if (str.indexOf("-") !== -1 || str.indexOf("_") !== -1) {
      str = camelize(str);
    }
    return str;
  }
)


// 翻译
const translate = (text: string): Promise<translateResult> => {
    // http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=你好
    // type的类型有: 
    //   AUTO
    //   ZH_CN2EN 中文 -> 英语
    //   ZH_CN2JA 中文 -> 日语
    //   ZH_CN2KR 中文 -> 韩语
    //   ZH_CN2FR 中文 -> 法语
    //   ZH_CN2RU 中文 -> 俄语
    //   ZH_CN2SP 中文 -> 西语
    //   EN2ZH_CN 英语 -> 中文
    //   JA2ZH_CN 日语 -> 中文
    //   KR2ZH_CN 韩语 -> 中文
    //   FR2ZH_CN 法语 -> 中文
    //   RU2ZH_CN 俄语 -> 中文
    //   SP2ZH_CN 西语 -> 中文

  return new Promise((resolve, reject) => {
    axios({
      url: "http://fanyi.youdao.com/translate",
      method: "GET",
      params: {
        doctype: "json",
        type: "AUTO", // AUTO EN2ZH_CN
        i: text,
      }
    }).then(res => {
      if (res.status === 200) {
        resolve(res.data);
      } else {
        reject();
      }
    }).catch(err => {
      reject(err);
    });
  });
}


export {
  handleCompName,
  translate
}